#include "bluetooth.h"


// 蓝牙端口配置
void GPIO_Bluetooth_config(){
	/*
	BT_STATE - P5.2
	BT_EN    - P0.4
	BT_TXD   - P0.3
	BT_RXD   - P0.2
	*/
	GPIO_InitTypeDef init;
	init.Pin = GPIO_Pin_2;
	init.Mode = GPIO_PullUp;
	GPIO_Inilize(GPIO_P5, &init);
	
	init.Pin = GPIO_Pin_2 |GPIO_Pin_3 | GPIO_Pin_4;
	init.Mode = GPIO_PullUp;
	GPIO_Inilize(GPIO_P0, &init);
}


// 蓝牙串口配置
void UART_Bluetooth_Config(){
	/*
	  BT_TXD   - P0.3
	  BT_RXD   - P0.2
	 */
	COMx_InitDefine uart_init;
	/*
	  UART_ShiftRight: 按位移动输出，按位传输，效率较低
	  UART_8bit_BRTx： 8位数据传输，可变波特率（bps）
	  UART_9bit		： 9位数据传输，固定波特率（bps）
	  UART_9bit_BRTx： 9位数据传输，可变波特率（bps），最后一位为求校验位
	 */
	uart_init.UART_Mode = UART_8bit_BRTx;	//模式
	uart_init.UART_BRT_Use = BRT_Timer2;	// 波特率发生器率,   BRT_Timer1~BRT_Timer4
	uart_init.UART_BaudRate = 115200ul;		//波特率, 	   一般 110 ~ 115200
	uart_init.Morecommunicate = DISABLE;	//多机通讯允许, ENABLE,DISABLE
	uart_init.UART_RxEnable = ENABLE;		//允许接收,   ENABLE,DISABLE
	uart_init.BaudRateDouble = DISABLE;		//波特率加倍, ENABLE,DISABLE
	UART_Configuration(UART4, &uart_init);
	
	// uart中断使能
	NVIC_UART4_Init(ENABLE, Priority_1);
	
	// uart需要打开对应的开关才能使用
	UART4_SW(UART4_SW_P02_P03);
}


// 蓝牙模块初始化
void bluetooth_init(){
	GPIO_Bluetooth_config();
	UART_Bluetooth_Config();
}


// 数据写入蓝牙
void write2bt(char dat[]){
	int i;
//	printf(strlen(dat));
	for(i = 0; i < strlen(dat); i++){
		// 写入蓝牙连接的串口
		TX4_write2buff((char)dat[i]);
	}
	// 要加上\r\n蓝牙才会认为是一个命令
	TX4_write2buff('\r');
	TX4_write2buff('\n');
}


// 测试蓝牙 - 发送AT
void bt_test(){
	write2bt(BT_T_TEST);
}


// 扫描从机蓝牙 发送AT+INQ
void bt_scan(){
	write2bt(BT_T_SCAN);
}


// 指定从机地址连接蓝牙 - 发送AT+CONA
void bt_connect(char *name){
	// 连接指定名字的蓝牙 - 连接成功state引脚会拉高(和CPU没有反向三极管会给CPU供电)
	// command要预留好足够的空间来放入name
	char command[BT_MAX_BYTE] = BT_T_CONA;
	strcat(command, name);
	write2bt(command);
}


// 断开指定从机蓝牙
void bt_disconnect(){
	// EN引脚置于低电平 发送断开指令才能起效
	printf("bt_disconnect");
	write2bt("AT+DISC1");
}


// PC调试工具串口与蓝牙调试串口交互
void uart1_connect_uart_bt_test(){
	bt_test();
//	if(COM1.RX_TimeOut > 0  && --COM1.RX_TimeOut == 0){
//		if(COM1.RX_Cnt > 0){
//			int i = 0;
//			while(COM1.RX_Cnt){
//				--COM1.RX_Cnt;
////				TX1_write2buff(RX1_Buffer[i++]);
////				TX2_write2buff(RX1_Buffer[i++]);
//				TX2_write2buff("A");
//			}
//		}
//	}
}


// 监听串口并处理收到的蓝牙响应信息
char listen_bt(){
	if(COM2.RX_TimeOut > 0  && --COM2.RX_TimeOut == 0){
		if(COM2.RX_Cnt > 0){
			// 响应状态 +OK / OK
			char rx_dat_state[BT_ST_MAX_BYTE];
			int i = 0;
			while(COM2.RX_Cnt){
				--COM2.RX_Cnt;
				
				// 遇到\r\n说明第一行信息已经发送完毕，\r\n不要放入字符串，跳过
				if(RX2_Buffer[i] == '\r'){
					break;
				}
				
				// 响应状态数据接收
				rx_dat_state[i] = RX2_Buffer[i];
				
				i++;
			}
			// 下次数据到来前RX_Cnt必须置为0
			COM2.RX_Cnt = 0;
			
			// 末尾补\0才能使字符串
			rx_dat_state[i] = '\0';
			printf("rx_dat_state=%s=", rx_dat_state);
			// 判断指令是否执行成功
			if(strcmp(rx_dat_state, BT_R_OK) == 0){
				// 将接受到的数据传递给接受者
				printf("success");
				return SUCCESS;
			}
		}
	}
	return BT_FAIL;
}



// 监听串口并处理收到的蓝牙响应信息
//char listen_bt(char *dat){
//	if(COM2.RX_TimeOut > 0  && --COM2.RX_TimeOut == 0){
//		if(COM2.RX_Cnt > 0){
//			// 响应状态 +OK / OK
//			char rx_dat_state[BT_ST_MAX_BYTE];
//			// 响应内容
//			char rx_dat[BT_MAX_BYTE][BT_MAX_BYTE];
//			int i = 0;
//			u8 line = 0;
//			while(COM2.RX_Cnt){
//				--COM2.RX_Cnt;
//				
//				// 遇到\r\n说明一行信息已经发送完毕，\r\n不要放入字符串，跳过
//				if(RX2_Buffer[i] == '\r' | RX2_Buffer[i] == '\n'){
//					// 遇到/n说明换行
//					if(RX2_Buffer[i] == '\n'){
//						// 换行前给上一行的末尾加上\0(加上'\0'才能成为字符串)
//						if(line == 0){
//							rx_dat_state[i] = '\0';
//						}else{
//							rx_dat[line][i] = '\0';
//						}
//						
//						line++;
//					}
//					
//					// 重置i为0，为记录下一行做准备
//					i = 0;
//					continue;
//				}
//				
//				if(line == 0){
//					// 没换行之前的内容就是响应状态，将数据一个字符一个字符拼凑起来
//					rx_dat_state[i] = RX2_Buffer[i];
//				}else{
//					// 第一次换行之后的内容就是响应内容，将数据一个字符一个字符拼凑起来
//					rx_dat[line][i] = RX2_Buffer[i];	
//				}
//				
//				i++;
//			}
//			// 下次数据到来前RX_Cnt必须置为0
//			COM2.RX_Cnt = 0;
//			printf("rx_dat_state=%s=", rx_dat_state);
//			printf("rx_dat=%s=", rx_dat[1]);
//			// 判断指令是否执行成功
//			if(strcmp(rx_dat_state, BT_R_OK) == 0){
//				// 将接受到的数据传递给接受者
//				printf("success");
//				*dat = rx_dat;
//				return SUCCESS;
//			}
//		}
//	}
//	return 1;
//}


//// 测试
//void uart4_2_uart1(){
//	if(COM4.RX_TimeOut > 0  && --COM4.RX_TimeOut == 0){
//		if(COM4.RX_Cnt > 0){
//			int i = 0;
//			while(COM4.RX_Cnt){
//				--COM4.RX_Cnt;
//				TX1_write2buff(RX4_Buffer[i++]);
//			}
//		}
//	}
//}
//
//
//// 测试
//void uart1_2_uart4(){
//	int i = 0;
//	if(COM1.RX_TimeOut > 0 && --COM1.RX_TimeOut == 0){
//		if(COM1.RX_Cnt > 0){
//			// 串口1收到数据写入串口2
//			while(COM1.RX_Cnt){
//				--COM1.RX_Cnt;
////				TX1_write2buff(RX1_Buffer[i++]);
//				printf("RX1_Buffer=%c\n", RX1_Buffer[i]);
//				TX4_write2buff(RX1_Buffer[i++]);
//			}
//		}
//	}
//}


// 串口1接收数据写到到串口4
void uart1_2_uart4(){
	int i;
	// RX_TimeOut默认为5,如果减5下之后还是没有数据发送过来就开始接收
//	PrintString1("1写入4开始！");
	if (COM1.RX_TimeOut > 0 && --COM1.RX_TimeOut == 0){
		if(COM1.RX_Cnt > 0){
			// 多个接收值写入
			for(i = 0; i < COM1.RX_Cnt; i++){
				TX4_write2buff(RX1_Buffer[i]);
				//PrintString1("1写入4成功！");
			}
		}
		COM1.RX_Cnt = 0;
	}
}


// 串口4接收到数据写到串口1
void uart4_2_uart1(){
	int i;
//	PrintString1("4写入1开始！");
	// RX_TimeOut默认为5,如果减5下之后还是没有数据发送过来就开始接收
	if (COM4.RX_TimeOut > 0 && --COM4.RX_TimeOut == 0){
		if(COM4.RX_Cnt > 0){
			// 多个接收值写入
			for(i = 0; i < COM4.RX_Cnt; i++){
				TX1_write2buff(RX4_Buffer[i]);
				//PrintString1("4写入1成功！");
			}
		}
		COM4.RX_Cnt = 0;
	}
}



// 测试
void uart2_2_uart1(){
	if(COM2.RX_TimeOut > 0  && --COM2.RX_TimeOut == 0){
		if(COM2.RX_Cnt > 0){
			int i = 0;
			while(COM2.RX_Cnt){
				--COM2.RX_Cnt;
				TX1_write2buff(RX2_Buffer[i++]);
			}
		}
	}
}


// 测试
void uart1_2_uart2(){
	int i = 0;
	if(COM1.RX_TimeOut > 0 && --COM1.RX_TimeOut == 0){
		if(COM1.RX_Cnt > 0){
			// 串口1收到数据写入串口2
			while(COM1.RX_Cnt){
				--COM1.RX_Cnt;
//				TX1_write2buff(RX1_Buffer[i++]);
				TX2_write2buff(RX1_Buffer[i++]);
			}
		}
	}
}


